// namespace Ex
// {

//     public class SingleVarType : VarType
//     {
//         private readonly UsableLuaType type;

//         public UsableLuaType Type
//         {
//             get { return type; }
//         }

//         private readonly object value;
//         public SingleVarType(object value)
//         {
//             this.value = value;
//             this.type = Tool.GetCsToLuaType(value);
//         }

//         public static readonly SingleVarType Empty = new(UsableLuaType.nil);

//         public bool? GetBool()
//         {
//             return value as bool?;
//         }

//         public double? GetDouble()
//         {
//             return value as double?;
//         }

//         public string? GetString()
//         {
//             return value as string;
//         }

//         public IExFunction? GetFunction()
//         {
//             return value as IExFunction;
//         }

//         public IExTable? GetTable()
//         {
//             return value as IExTable;
//         }

//         public ExCsRawData? GetData()
//         {
//             return value as ExCsRawData;
//         }

//         public static SingleVarType FetchFromLuaStack(EnvLua env, UsableLuaType type)
//         {
//             try
//             {
//                 if (Tool.GetTypeOnStack(env.Current, -1) != type)
//                 {
//                     throw new InvalidOperationException(string.Format("Invalid type: should be {0}", type));
//                 }
//                 var value = env.FetchObjectFromLuaStack(type);
//                 return new SingleVarType(value);
//             }
//             catch (Exception e)
//             {
//                 e.Data["arg_type"] = type;
//                 throw;
//             }
//         }

//         public static SingleVarType FetchFromLuaStack(EnvLua env)
//         {
//             var type = Tool.GetTypeOnStack(env.Current, -1);
//             return FetchFromLuaStack(env, type);
//         }

//         public override void PushToLuaStack(EnvLua env)
//         {
//             env.PushObjectToLuaStack(value, type);
//         }
//     }
// }